<?php
/**
 * TauxProcessTable.php
 */

namespace RHX\Model\Table;

use Zend\Db\Adapter\Adapter;
use Zend\Db\TableGateway\AbstractTableGateway;
use Zend\Db\ResultSet\ResultSet;
use RHX\Model\Object\TauxProcess;
use Zend\Db\Sql\Select;
use Zend\Db\Sql\Where;
use Zend\Db\Sql\Sql;
use Zend\Db\Sql\Expression;

class TauxProcessTable extends AbstractTableGateway {

    /**
     * Nom de la table dans la base de données
     *
     * @var string $table
     */
    protected $table = 'rh_taux_process';

    /**
     * Constructeur de la Classe
     * 
     * @param \RHX\Model\Table\Adapter $adapter
     */
    public function __construct(Adapter $adapter) {
	$this->adapter			 = $adapter;
	$this->resultSetPrototype	 = new ResultSet();
	$this->resultSetPrototype->setArrayObjectPrototype(new TauxProcess($adapter));
	$this->initialize();
    }

    /**
     * Tous les "TauxProcess" de la table
     *
     * @param string $order Ordre d'affichage
     * @return type
     */
    public function getAll($order = 'id ASC') {
	return $this->select(function(Select $select) use($order) {
			    $select->order($order);
			});
    }
    
     /**
     * Sauvegarder les données d'un tauxProcess
     *
     * @param \RHX\Model\Object\TauxProcess $tp
     * @return type
     * @throws \Exception
     */
    public function save(TauxProcess $tp) {
	$data		 = array(
	    'id'		 => $tp->id,
            'taux'		 => $tp->taux,
            'poste_code'		 => $tp->poste_code,
            'nouveau_taux'		 => $tp->nouveau_taux,
            'date_application'		 => $tp->date_application,
            'is_applied'		 => $tp->is_applied
	);
	$id	 = (int) $tp->id;
	if ($id == 0) {
	    $this->insert($data);

	    return $this->lastInsertValue;
	}
	elseif ($this->get($id)) {
	    $this->update($data, array('id' => $id));

	    return $id;
	}
	else {
	    throw new \Exception("Erreur : La TauxProcess # $id n'a pas été sélectionner pour une mise à jour");
	}
    }
    /**
     * Récupérer un TauxProcess
     *
     * @param  $id
     * @return TauxProcess
     * @throws \Exception
     */
    public function get($id) {
	$row = $this->select(array('id' => $id))
		->current();
	if (!$row)
	    throw new \Exception("Erreur : Le TauxProcess  #$id n'a pas été trouvé");

	return $row;
    }
    
    /**
     * Effacer un TauxProcess
     *
     * @param type $id
     * @return type
     */
    public function erase($id) {
	return $this->delete(array('id' => $id));
    }

    public function executeQuery($sql) {
	return $this->adapter
			->query($sql)
			->execute();
    }
    
    
     /**
     * Tous les "TauxProcess" déjà appliqué de la table
     * @param boolean $bool définit les appliqué/non appliqué
     * @param string $order Ordre d'affichage
     * @return type
     */
    public function getApplied($bool = true, $order = 'id ASC') {
	return $this->select(function(Select $select) use($bool, $order) {
                            $where  = new Where();
                            $where->equalTo('is_applied', $bool);
                            
                            $select->where($where);
			    $select->order($order);
			});
    }
    
    /* recupérer les taux horaires existant et qui ne figurent pas dans la liste des traitements non encore appliqué
     */
    public function getListTauxExists(){
        #$sql	 = "SELECT   DISTINCT a.taux as taux FROM rh_avenant a  INNER JOIN rh_employe e ON e.avenant_id = a.id WHERE e.actif =1 ORDER BY a.taux desc";
        
        $sql = "SELECT DISTINCT a.taux AS taux
                       FROM rh_avenant a
                       INNER JOIN rh_employe e
                            ON e.avenant_id = a.id 
                       WHERE e.actif = 1 
                            AND a.taux NOT IN ( SELECT taux FROM rh_taux_process WHERE is_applied = 0)
                       ORDER BY a.taux desc";
        return $this->adapter->query($sql)->execute();
    }
    /*recupère en BDD la liste des couple (taux, poste) existant par poste
     * 
     * @return row ligne ont les colonnes sont : 'code', 'taux',  'count'
     * 'code' : code poste concerné (peuvent se repeter)
     * 'libelle' : libelle du poste
     * 'taux' : taux du code
     * 'count' : nombre de couple (poste, taux) existant
     */
    
     public function getListTauxPosteExists(){        
        
        $sql = "SELECT   
		    p.code,		    
		    a.taux,
		    COUNT(*) AS COUNT

		  FROM rh_employe e
		    JOIN rh_avenant a
		      ON e.avenant_id = a.id
		    JOIN rh_poste p
		      ON a.poste_id = p.id
		  GROUP BY a.taux,p.code
		  ORDER BY p.rang ASC, a.taux
		";
	
        return $this->adapter->query($sql)->execute();
    }
    
    public function isExistsByCodeAndTaux($code, $taux){  
        
        $sql = "
            SELECT COUNT(*) AS count FROM rh_taux_process
                WHERE poste_code = '$code'
                AND round (taux, 3) = $taux ";
        //var_dump($sql); 
        
        $statement = $this->adapter->query($sql);
        $result =  $statement->execute();
        $current = $result->current();
        
        $count = $current['count'];
        //var_dump('kount ' . $count); 
        return (boolean) $count;
    }
    public function getByCodeAndTaux($code, $taux, $is_applied){
        $sql = "
            SELECT * FROM rh_taux_process
                WHERE poste_code = '$code'
                AND round (taux, 3) = $taux ";
        
        $sql .= "AND is_applied = ". (int)$is_applied ." "; 
        
        $statement = $this->adapter->query($sql);
        $result =  $statement->execute();
        $row = $result->current();
        
        $obj = $row ? $this->get($row['id']) : false;
        
        return $obj;
    }   
}

